Szakdolgozatom keretében képmanipuláló algoritmusokkal, és azok egy lehetséges párhuzamosításával\cite{seq_parallel_prog} foglalkozom. A tárgyalt algoritmusok minden esetben az úgynevezett filterezésre vezethetők vissza.

A filter\cite{filter} algoritmus esetében egy konvolúciós mátrix segítségével hajthatunk végre transzformációt a pixeleken. A mátrixok segítségével például a következő transzformációk valósíthatók meg:
\begin{itemize}
	\item Élkeresés
	\begin{itemize}
		\item Horizontális
		\item Vertikális
		\item 45 fokos
		\item Összes
	\end{itemize}
	\item Elmosás
	\item Mozgó elmosás
	\item Élesítés
	\item Élek túlzása
	\item Dombornyomat
\end{itemize}

Hagyományosan a szoftverek egymás után végrehajtandó utasításokat, számításokat definiálnak.
\begin{itemize}
	\item Egy számítógépen, egy CPU magon fut a program.
	\item A megoldandó probléma utasítások diszkrét sorozatára bontható.
	\item Az utasítások egymás után hajtódnak végre.
	\item Egy időben csak egy utasítás hajtódik végre.
\end{itemize}

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/serialProblem.png}
	\caption{Szekvenciális programok modellje}
\end{figure}


Ezzel szemben párhuzamos programok esetén:
\begin{itemize}
	\item A program több CPU magon fut.
	\item A probléma olyan diszkrét részekre van bontva, amelyek konkurensen megoldhatók.
	\item Minden rész tovább bontható utasítások sorozatára.
	\item Minden egyes rész utasításai egyidejűleg végrehajthatók különböző processzorokon.
	\item Koordináció, irányítás szükséges a felbontáshoz, valamint az eredmények felhasználáshoz.
\end{itemize}

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/parallelProblem.png}
	\caption{Párhuzamos programok modellje}
\end{figure}

Miért használjunk párhuzamos programokat?
\begin{itemize}
	\item Idő és pénz takarítható meg. Elméletben több számítási egységgel a probléma rövidebb alatt megoldható.
	\item Nagyobb problémák oldhatók meg.
	\item Konkurencia biztosítható. Egy processzor egy időben több különböző feladaton is dolgozhat egyszerre.
\end{itemize}

A mai számítógépek szinte mindegyike már többmagos processzorokat tartalmaz. A magok száma növekszik, az órajel csökken. A hagyományos módon megírt programok nem minden esetben képesek kihasználni a hardver adta lehetőséget: ha a szoftver egy magra lett tervezve, az órajelek csökkenésével a szoftver lassabb teljesítményre lesz képes. 

Továbbá felhasználhatók a grafikus kártyák is a számításokra. Ennek a módszernek a neve GPGPU (General-Purpose Computing on Graphics Processing Units). Az egyik domináns nyílt keretrendszer az OpenCL, amely a szakdolgozatomban bemutatásra kerül.

\begin{figure}[H]
	\includegraphics[resolution=96]{pics/cpu_gpu_image.png}
	\caption{CPU és GPU fejlődése}
\end{figure}

\section{Alkalmazás}
A képmanipulálás olyan feladat, ahol egy adott kép pixeljeire kell egy maghatározott számítást elvégezni. Amennyiben a transzformáció során egy pixel módosításához nem szükséges további pixel(ek) információja, akkor ez végrehajtható különböző számítási egységeken, ezáltal a feladat párhuzamosítható. A filterre ez teljesül.